const express = require('express')
const app = express()
const port = 3000
const joi = require('joi')
const config = require('./config')
const expressJwt = require('express-jwt')
//配置cors跨域
const cors = require('cors')
//将cors注册为全局中间件
app.use(cors())
//配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))
//优化res.send()的全局中间件
app.use(function(req,res,next){
  //status = 0为成功 1 为失败
  res.cc = function(err,status = 1){
    return res.send({
      //状态
      status,
      //状态描述，判断err是错误对象还是字符串
      message:err instanceof Error ? err.message : err,
    })
  }
  next()
})

//使用中间件解析token
app.use(
  expressJwt({
      secret: config.jwtSecretKey
  }).unless({ path: ['/api/login','/api/reguser'] }) // 登录页无需校验
)


//导入并注册用户模块
const userRouter = require('./router/user')
app.use('/api',userRouter)

//导入并注册个人中心的路由模块
const userinfoRouter = require('./router/userinfo')
app.use('/my',userinfoRouter)

//全局错误级别中间件 捕获验证失败的错误，并把验证的结果响应给客户端
app.use(function(err,req,res,next){
  //数据验证失败
  if(err instanceof joi.ValidationError) return res.cc(err)
  //token解析的错误
  if(err.name === 'UnauthorizedError'){
    return res.cc('no login')
  }
  //未知错误
  res.cc(err)
})

app.listen(port,()=>{
  console.log('api server running at 127.0.0.1:3000')
})